/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Negocio;

import BaseDatos.GestorBD;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import Util.Varios;
/**
 *
 * @author Sara
 */
public class PremisaSara implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "Premisa";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Premisa";

    //Atributos de la tabla Premisas
    private int _iIdPremisa;
    private String _sTabla;
    private String _sCampo;
    private int _iMaximo;
    private int _iMinimo;
    private String _sValorMin;
    private String _sValorMax;
    private String _sValor;
    private int _iRegla;
    private double _dValorMorosidad;

    //Vector que almacena los errores que se produzcan en las operaciones con la clase.
    private Vector<String> _vErrores = new Vector<String>();

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        //Inicializo el vector de errores
        this._vErrores.clear();
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " ORDER BY Regla, IdPremisa");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Recupera el contenido de la tabla cuando el número de regla es igual a regla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectRegla (int regla, Vector columnIdentifiers, Vector dataVector){
        //Inicializo el vector de errores
        this._vErrores.clear();
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            String sSQL="SELECT * FROM " + this._sNombreTabla + " WHERE Regla =" + regla + " ORDER BY IdPremisa";
            
            System.out.println(sSQL);
            ResultSet rs = st.executeQuery(sSQL);
            
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.
                   // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Inserta un registro en la tabla
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        String sSQL = "INSERT INTO " + this._sNombreTabla + " (Tabla, Campo, Maximo, Minimo, Valor, Regla )" +
            " VALUES ('" +
            this._sTabla + "', '" + this._sCampo + "', " +  this._iMaximo + ", " + this._iMinimo  + 
              ", '" + this._sValor + "', " + this._iRegla + ")";
        System.out.println(sSQL);
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();

            //Recuperar y cargar en la clase el valor de la clave AUTONUMERICA generada por el motor de BD
            this._iIdPremisa = GestorBD.obtenerLastAutonumerico();
            return true;
        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }
/*
     * Inserta el valor de morosidad esperado para una determinada regla 
     */
    public boolean insertValorMorosidad ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla +" SET ValorMorosidad = " +  this._dValorMorosidad + 
                " WHERE Regla= " + this._iRegla;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();

            //Recuperar y cargar en la clase el valor de la clave AUTONUMERICA generada por el motor de BD
            this._iIdPremisa = GestorBD.obtenerLastAutonumerico();
            return true;
        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Actualiza un registro en la entidad auxiliar
     */
    public boolean update ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla + " SET Tabla = '" + this._sTabla + "', " +
            " Campo = '" + this._sCampo + "', " +
            " Maximo = '" + this._iMaximo + "', " +
            " Minimo = '" + this._iMinimo + "', " +
            " Valor = '" + this._sValor + "', " + "'" +
            " ValorMorosidad = '" + this._dValorMorosidad + "', " + "'" +
            " WHERE IdPremisa = " + this._iIdPremisa;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Borra un registro de la Entidad Auxiliar
     */
    public boolean delete (){
        //Inicializo el vector de errores
        this._vErrores.clear();
        String sSQL = "DELETE FROM " + this._sNombreTabla + " WHERE " +
            " IdPremisa = " + this._iIdPremisa;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Valida los datos de la clase antes de hacer una inserción/actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        this._vErrores.clear();
//        if ( this._sCodigo.trim().equals("") )
//            this._vErrores.add ("El código es obligatorio");
//        if ( this._sDescripcion.trim().equals("") )
//            this._vErrores.add ("La descripción es obligatoria");
        return (this._vErrores.size () == 0);
    }

    /*
     * Carga SOLO los atributos que conforman la clave de la clase a partir de 2 vectores,
     * uno con los nombres de los campos
     * y otro con los valores de los mismos.
     */
    public void vectorJTableAClavesClase ( Vector columnIdentifiers, Vector dataRow ){
        int iIndice = Varios.getPosCadena(columnIdentifiers, "IdPremisa");
        this.inicializa();
        this._iIdPremisa = Integer.parseInt( dataRow.get(iIndice).toString() );
    }

    /*
     * Devuelve un vector cargado con los atributos de la clase para mostrar en el JTable del panel.
     * El orden de los atributos es el indicado
     * en el vector con los nombres de los campos.
     */
    public Vector claseAVectorJTable ( Vector columnIdentifiers ){
        Vector resul = new Vector ();    
        for (int i=0; i < columnIdentifiers.size(); i++){
            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("IdPremisa") == 0 )
                resul.add( this._iIdPremisa );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Tabla") == 0 )
                resul.add( this._sTabla );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Campo") == 0 )
                resul.add( this._sCampo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Maximo") == 0 )
                resul.add( this._iMaximo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Minimo") == 0 )
                resul.add( this._iMinimo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Valor") == 0 )
                resul.add( this._sValor );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Regla") == 0 )
                resul.add( this._iRegla );
        }
        return resul;
    }

    /*
     * Este método recupera de la tabla un registro cuya clave primaria están cargados en los
     atributos de la clase correspondientes a la clave. Se recuperan los campos del registro y
     se carga el resto de los atributos de la clase.
     */

    public void recupera (){
        //Inicializo el vector de errores
        this._vErrores.clear();
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " WHERE " +
                " IdPremisa = " + this._iIdPremisa);
            if ( rs.next() ) {
                this._sTabla = rs.getString("Tabla");
                this._sCampo = rs.getString("Campo");
                this._iMaximo= rs.getInt("Maximo");
                this._iMinimo= rs.getInt("Minimo");
                this._sValor= rs.getString("Valor");
                this._iRegla= rs.getInt("Regla");
            }
            rs.close();
            st.close();

        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void inicializa (){
        this._iIdPremisa = 0;
        this._sTabla = "";
        this._sCampo = "";
        this._iMaximo = 0;
        this._iMinimo= 0;
        this._sValor= "";
        this._iRegla= 0;
    }
    
     public int buscaSigRegla (){
        int valor=-1;
        //Inicializo el vector de errores
        this._vErrores.clear();
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("Select max(Regla) FROM " + this._sNombreTabla);
            rs.next();
            valor= rs.getInt(1); // El primer indice en rs es el 1, no el cero, por eso se suma 1.
               System.out.println(valor); 

            rs.close();
            st.close();
        }catch (SQLException e1){
            this._vErrores.add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return valor;
    }
     
    public int getiIdPremisa() {
        return _iIdPremisa;
    }

    public void setiIdPremisa(int _iIdPremisa) {
        this._iIdPremisa = _iIdPremisa;
    }

    public String getsTabla() {
        return _sTabla;
    }

    public void setsTabla(String _sTabla) {
        this._sTabla = _sTabla;
    }
    
    public String getsCampo() {
        return _sCampo;
    }

    public void setsCampo(String _sCampo) {
        this._sCampo = _sCampo;
    }
       
    public int getiMaximo() {
        return _iMaximo;
    }

    public void setsiMaximo(int _iMaximo) {
        this._iMaximo = _iMaximo;
    }

    public int getiMinimo() {
        return _iMinimo;
    }

    public void setsiMinimo(int _iMinimo) {
        this._iMinimo = _iMinimo;
    }
    
    public String getsValor() {
        return _sValor;
    }

    public void setssValor(String _sValor) {
        this._sValor = _sValor;
    }
       
    public int getiRegla() {
        return _iRegla;
    }

    public void setiRegla(int _iRegla) {
        this._iRegla = _iRegla;
    }  
    
    
    public double getdValorMorosidad() {
        return _dValorMorosidad;
    }

    public void setdValorMorosidad(double _dValorMorosidad) {
        this._dValorMorosidad = _dValorMorosidad;
    }
    
    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }
    
    public Vector<String> getvErrores() {
        return _vErrores;
    }

    public void setvErrores(Vector<String> _vErrores) {
        this._vErrores = _vErrores;
    }

    public String getsValorMax() {
        return _sValorMax;
    }

    public void setsValorMax(String _sFecMax) {
        this._sValorMax = _sFecMax;
    }

    public String getsValorMin() {
        return _sValorMin;
    }

    public void setsValorMin(String _sFecMin) {
        this._sValorMin = _sFecMin;
    }

    
}


